
<table border='1'>
  <thead>
    <tr>
      <td>参数</td>
      <td colspan="2">Promise.all</td>
      <td colspan="2">Promise.race</td>
      <td colspan="2">Promise.any</td>
    </tr>
    <tr>
      <td></td>
      <td>状态</td>
      <td style='width: 60px'>值</td>
      <td>状态</td>
      <td>值</td>
      <td>状态</td>
      <td>值</td>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>[p1]</td>
      <td>成功</td>
      <td>['a']</td>
      <td>成功</td>
      <td>'a'</td>
      <td>成功</td>
      <td>'a'</td>
    </tr>
    <tr>
      <td>[p1,p2,p3]</td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
    </tr>
    <tr>
      <td>[s1,s2,s3]</td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
    </tr>
    <tr>
      <td>[s1,p2,p3]</td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
    </tr>
    <tr>
      <td>[p1,s2,s3]</td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
    </tr>
    <tr>
      <td>[p2,s2,p3]</td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
      <td></td>
    </tr>
  </tbody>
</table>

<script>

// 1 （1）描述class是什么？
//  class是构造函数语法糖，是特殊的函数，但是不能当作普通函数调用

// （2）构造方法何时被调用？
// 声明类是，不是必须的

// （3）如何声明静态方法？
// 用static声明

// 2 （1）声明A类，有构造方法，参数为name，构造方法里用参数name内初始化实例属性name；有一个实例方法me，无参数，返回"我是某某"（用实例属性name显示在某某）
class A{
  name
  constructor(name){
    this.name=name
  }
  me(){
    return `我是${this.name}`
  }
}
const a=new A('某某')
a.me();

// （2）声明B类，继承A类，有构造方法，除了参数name，还有参数age，构造方法里初始化实例属性age；有实例方法me，无参数，（要求用到父类上的方法）返回"我是某某，今年n岁"
class B extends A{
 constructor(name,age){
   super(name)
   this.name=name
   this.age=age
 }
 me(){
  return `${super.me()},今年${this.age}岁`
 }
  
}
const b=new B('某某','n')
b.me()

// ```js

// ```

// 3 说明Promise.resolve的作用
//返回promise实例。状态是成功

// 4 用构造方法形式创建一个Promise实例，有一半的几率成功，一半的几率失败。
// const p=new Promise((resolve,reject)=>{
//     if(Math.random()>0.5){
//         console.log('成功');
//         resolve('成功！')//成功的结果
//     }else{
//         console.log('失败');
//         reject('失败！！！')//原因
//     }
// })



// 5 Promise实例有几个方法？（要写出参数是什么）
/* 3个
.then(成功的函数，失败的函数)
.catch(失败的函数)
.finally()没有参数，无论成功失败都执行


*/
// 6 ```let p = Promise.reject().catch(() => {/*???*/})``` 如果想让p的状态为失败应该怎样写???处的代码？
// let p1 = Promise.reject('失败').catch((e) =>{console.log(e)})

// 7 写一个delay的promise函数。
function delay(ms) {
    return new Promise(function (resolve) {
      setTimeout(resolve, ms);
    });
  }
  delay(1000)
    .then(() => {
      console.log("hello2");
    })



// 8 写出输出结果
// ```js  2  5 catch3  成功44 1 6
// setTimeout(() => console.log(1))
// console.log(2)
// Promise.reject(3).then(v => {
//   console.log(v)
//   return 4
// }).catch(v => {
//   console.log('catch'+v)
//   return 44
// }).then(v => {
//   console.log('成功',v)
//   setTimeout(() => console.log(6))
// }, v=>console.log('失败',v))
// console.log(5)

// 9 描述Promise.all/race/any/allSettled成功失败的条件
// Promise.all 所有的promise 都成功才成功，任何一个失败都失败，返回是promise实例的状态，按最慢的promise时间
// Promise.race 按最快改变promise状态，返回是promise实例的状态,成功/失败由最快状态改变的promise决定成功或失
// Promise.any()任何一个promise成功，返回成功promise，所有promise失效，返回失败的promise
// 成功最快的h时间，失败最慢的时间
// Promise.allSettled()全部搞定，返回值是promise实例的状态，成功最慢的改变状态promise花的时间


// 10 假设已经有一个promise版的d(ms, v, f)函数，ms代表延时毫秒数，ms毫秒后返回promise实例，v是promise的值，f是true时成功，是false时失败。有以下promise实例，比如d(1000, 'a', true)是一个延时1秒后成功的promise，它的值是'a'，d(1000, 'b', false)是一个延时1秒后失败的promise，它的值是'b'
// ```js
function d(ms, v, f) {
  return new Promise((resolve,reject) => {
    setTimeout(() => {
      f ? resolve(v) : reject(v)
    }, ms)
  })
}
let p1 = d(5000, 'a', true), 
p2 = d(1000, 'b', true),
p3 = d(3000, 'c', true),
s1 = d(4000, 'd', false),
s2 = d(0, 'e', false),
s3 = d(2000, 'f', false)
// ```
// 请问以下promise的结果和值是什么
//成功 ['a','b',c']  成功 'b'  成功 'b'
// 失败 'e' 失败'e' 失败['d','e','f']
// 失败 'd' 成功 'b' 成功'b'
// 失败 'e' 失败 e   成功 a
// 失败 'c' 失败 e   成功 b

</script>